using MES_workbench.Domian.Entities;
using MES_workbench.ErrorCode;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using SqlSugar;
using System.Text;
using System.Linq;
using System.Net.Http;
using Newtonsoft.Json;
using WebApplication1.Implement.DTO;
using WebApplication1.Implement.IServices;

namespace WebApplication1.Implement.Services
{
    /// <summary>
    /// 智能客服服务实现类
    /// </summary>
    public class ChatService : IChatService
    {
        private readonly SqlSugarClient _db;
        private readonly ILogger<ChatService> _logger;
        private readonly IAIService _aiService;
        private readonly IConfiguration _configuration;

        public ChatService(SqlSugarClient db, ILogger<ChatService> logger, IAIService aiService, IConfiguration configuration)
        {
            _db = db;
            _logger = logger;
            _aiService = aiService;
            _configuration = configuration;
        }

        /// <summary>
        /// 发送消息给AI客服
        /// </summary>
        public async Task<ApiResult<ChatMessageResponseDto>> SendMessageAsync(ChatMessageRequestDto request)
        {
            var result = new ApiResult<ChatMessageResponseDto>();
            var stopwatch = System.Diagnostics.Stopwatch.StartNew();

            try
            {
                _logger.LogInformation("开始处理智能客服消息: {Message}", request.Message);

                // 自动生成会话ID
                var sessionId = Guid.NewGuid().ToString();

                // 确保会话存在
                await EnsureSessionExistsAsync(sessionId, request.UserId);

                // 获取对话历史
                var conversationHistory = await GetConversationHistoryAsync(sessionId);

                // 保存用户消息
                await SaveMessageAsync(sessionId, "user", request.Message);

                // 获取AI回复
                var aiResponse = await GetAIResponseAsync(request.Message, conversationHistory);

                // 保存AI回复
                await SaveMessageAsync(sessionId, "assistant", aiResponse, (int)stopwatch.ElapsedMilliseconds);

                stopwatch.Stop();

                var response = new ChatMessageResponseDto
                {
                    Reply = aiResponse,
                    SessionId = sessionId,
                    Timestamp = DateTime.Now,
                    Success = true
                };

                result.success(response, "智能客服回复成功");
                _logger.LogInformation("智能客服回复成功，耗时: {ElapsedMs}ms", stopwatch.ElapsedMilliseconds);
            }
            catch (Exception ex)
            {
                stopwatch.Stop();
                _logger.LogError(ex, "智能客服处理失败");
                
                var errorSessionId = Guid.NewGuid().ToString();
                var errorResponse = new ChatMessageResponseDto
                {
                    Reply = "抱歉，我暂时无法回答您的问题，请稍后再试。如果问题持续存在，请联系技术支持。",
                    SessionId = errorSessionId,
                    Success = false,
                    ErrorMessage = ex.Message
                };

                result.success(errorResponse, "智能客服处理出现错误");
            }

            return result;
        }

        /// <summary>
        /// 获取聊天历史记录
        /// </summary>
        public async Task<ApiResult<List<ChatHistoryDto>>> GetChatHistoryAsync(string sessionId)
        {
            var result = new ApiResult<List<ChatHistoryDto>>();

            try
            {
                _logger.LogInformation("获取聊天历史: {SessionId}", sessionId);
                
                var messages = await _db.Queryable<ChatMessage>()
                    .Where(m => m.SessionId == sessionId)
                    .OrderBy(m => m.CreatedAt)
                    .ToListAsync();

                var historyList = messages.Select(m => new ChatHistoryDto
                {
                    SessionId = m.SessionId,
                    UserMessage = m.MessageType == "user" ? m.Content : "",
                    BotReply = m.MessageType == "assistant" ? m.Content : "",
                    CreatedAt = m.CreatedAt,
                    MessageType = m.MessageType
                }).ToList();

                result.success(historyList, "获取聊天历史成功");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "获取聊天历史失败: {SessionId}", sessionId);
                result.msg = "获取聊天历史失败";
            }

            return result;
        }

        /// <summary>
        /// 创建新的聊天会话
        /// </summary>
        public async Task<ApiResult<string>> CreateChatSessionAsync(string? userId = null)
        {
            var result = new ApiResult<string>();

            try
            {
                var sessionId = Guid.NewGuid().ToString();
                result.success(sessionId, "创建聊天会话成功");
                _logger.LogInformation("创建聊天会话成功: {SessionId}", sessionId);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "创建聊天会话失败");
                result.msg = "创建聊天会话失败";
            }

            return result;
        }

        /// <summary>
        /// 获取用户的所有聊天会话
        /// </summary>
        public async Task<ApiResult<List<ChatHistoryDto>>> GetUserSessionsAsync(string? userId = null)
        {
            var result = new ApiResult<List<ChatHistoryDto>>();

            try
            {
                var sessions = await _db.Queryable<ChatSession>()
                    .Where(s => userId == null || s.UserId == userId)
                    .Where(s => s.IsActive)
                    .OrderByDescending(s => s.UpdatedAt)
                    .ToListAsync();

                var sessionList = sessions.Select(s => new ChatHistoryDto
                {
                    SessionId = s.SessionId,
                    UserMessage = s.Title,
                    CreatedAt = s.CreatedAt
                }).ToList();

                result.success(sessionList, "获取用户会话列表成功");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "获取用户会话列表失败");
                result.msg = "获取用户会话列表失败";
            }

            return result;
        }

        #region 私有方法

        /// <summary>
        /// 构建系统提示词
        /// </summary>
        private string BuildSystemPrompt()
        {
            return @"你是一个专业的MES生产管理系统智能客服助手。你的职责是：

1. 帮助用户了解和使用MES生产管理系统的各项功能
2. 解答关于工单管理、工序流程、报工等相关问题
3. 提供系统操作指导和最佳实践建议
4. 协助解决用户在使用系统过程中遇到的问题

请注意：
- 始终使用中文回复
- 保持专业、友好的语调
- 如果不确定答案，请诚实说明并建议联系技术支持
- 优先提供具体、可操作的建议
- 关注生产制造领域的专业术语和流程";
        }

        /// <summary>
        /// 构建对话上下文
        /// </summary>
        private string BuildConversationContext(List<ChatMessage> history, string currentMessage)
        {
            var context = "对话历史：\n";
            
            foreach (var msg in history.TakeLast(6)) // 只取最近6条消息
            {
                var role = msg.MessageType == "user" ? "用户" : "助手";
                context += $"{role}: {msg.Content}\n";
            }
            
            context += $"用户: {currentMessage}\n助手: ";
            return context;
        }

        /// <summary>
        /// 获取AI回复
        /// </summary>
        private async Task<string> GetAIResponseAsync(string userMessage, List<ChatHistoryItem> conversationHistory)
        {
            try
            {
                // 构建系统提示词
                var systemPrompt = BuildSystemPrompt();
                
                // 调用AI服务获取回复
                var aiResponse = await _aiService.GetAIResponseAsync(userMessage, conversationHistory, systemPrompt);
                
                if (!string.IsNullOrEmpty(aiResponse))
                {
                    return aiResponse;
                }
                
                // 如果AI服务返回空结果，使用回退逻辑
                return GetIntelligentMESResponse(userMessage);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "AI回复生成失败，使用回退逻辑");
                return GetIntelligentMESResponse(userMessage);
            }
        }

        /// <summary>
        /// 获取对话历史
        /// </summary>
        private async Task<List<ChatHistoryItem>> GetConversationHistoryAsync(string sessionId)
        {
            try
            {
                var messages = await _db.Queryable<ChatMessage>()
                    .Where(m => m.SessionId == sessionId)
                    .OrderByDescending(m => m.CreatedAt)
                    .Take(20) // 获取最近20条消息
                    .OrderBy(m => m.CreatedAt)
                    .ToListAsync();

                return messages.Select(m => new ChatHistoryItem
                {
                    Role = m.MessageType,
                    Content = m.Content,
                    Timestamp = m.CreatedAt
                }).ToList();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "获取对话历史失败: {SessionId}", sessionId);
                return new List<ChatHistoryItem>();
            }
        }

        /// <summary>
        /// 确保会话存在
        /// </summary>
        private async Task EnsureSessionExistsAsync(string sessionId, string? userId)
        {
            try
            {
                var existingSession = await _db.Queryable<ChatSession>()
                    .Where(s => s.SessionId == sessionId)
                    .FirstAsync();

                if (existingSession == null)
                {
                    await CreateChatSessionInternalAsync(sessionId, userId);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "确保会话存在失败: {SessionId}", sessionId);
            }
        }

        /// <summary>
        /// 获取智能MES回复
        /// </summary>
        private string GetIntelligentMESResponse(string userMessage)
        {
            var message = userMessage.ToLower();
            
            // 问候语识别
            if (message.Contains("你好") || message.Contains("您好") || message.Contains("hello") || message.Contains("hi"))
            {
                return "您好！我是MES生产管理系统的智能客服助手。😊\n\n" +
                       "我可以帮助您：\n" +
                       "• 解答工单管理相关问题\n" +
                       "• 指导工序流程操作\n" +
                       "• 协助报工功能使用\n" +
                       "• 提供系统操作建议\n\n" +
                       "请告诉我您遇到的具体问题，我会尽力为您解答！";
            }
            
            // 工单相关问题
            if (message.Contains("工单") || message.Contains("订单"))
            {
                if (message.Contains("创建") || message.Contains("新建") || message.Contains("添加"))
                {
                    return "创建工单的步骤：\n\n" +
                           "1. 登录MES系统后，进入工单管理模块\n" +
                           "2. 点击\"新建工单\"按钮\n" +
                           "3. 填写必要信息：\n" +
                           "   • 产品编号和名称\n" +
                           "   • 生产数量\n" +
                           "   • 交期要求\n" +
                           "   • 优先级设置\n" +
                           "4. 选择生产工艺路线\n" +
                           "5. 保存并提交审核\n\n" +
                           "💡 提示：工单创建后需要经过审核才能开始生产。";
                }
                else if (message.Contains("查询") || message.Contains("查看") || message.Contains("状态"))
                {
                    return "查询工单信息的方法：\n\n" +
                           "• 工单列表查询：在工单管理页面可以看到所有工单\n" +
                           "• 条件筛选：可按状态、日期、产品等条件筛选\n" +
                           "• 详细信息：点击工单号可查看详细信息\n" +
                           "• 实时状态：\n" +
                           "  - 待审核：工单已创建，等待审核\n" +
                           "  - 已审核：工单通过审核，可以开始生产\n" +
                           "  - 生产中：工单正在执行\n" +
                           "  - 已完成：工单生产完毕\n" +
                           "  - 已取消：工单被取消\n\n" +
                           "📊 您也可以通过API接口 /api/customer/workorders 获取工单数据。";
                }
                else
                {
                    return "工单管理功能包括：\n\n" +
                           "🔸 工单创建：新建生产工单\n" +
                           "🔸 工单查询：查看工单状态和进度\n" +
                           "🔸 工单修改：更新工单信息\n" +
                           "🔸 工单审核：审批工单执行\n" +
                           "🔸 工单跟踪：实时监控执行状态\n\n" +
                           "请告诉我您具体想了解工单的哪个方面？比如创建、查询、修改等。";
                }
            }
            
            // 工序相关问题
            else if (message.Contains("工序") || message.Contains("流程") || message.Contains("工艺"))
            {
                if (message.Contains("设置") || message.Contains("配置") || message.Contains("定义"))
                {
                    return "工序流程设置指南：\n\n" +
                           "1. 进入工艺管理模块\n" +
                           "2. 创建工艺路线：\n" +
                           "   • 定义工序步骤\n" +
                           "   • 设置工序顺序\n" +
                           "   • 配置工时标准\n" +
                           "   • 指定设备要求\n" +
                           "3. 质量控制点设置：\n" +
                           "   • 检验项目定义\n" +
                           "   • 检验标准配置\n" +
                           "   • 不合格处理流程\n\n" +
                           "⚙️ 工序设置完成后，可以应用到相应的工单中。";
                }
                else
                {
                    return "工序流程管理功能：\n\n" +
                           "🔸 工序定义：设置生产工序步骤和标准\n" +
                           "🔸 流程配置：配置完整的生产工艺路线\n" +
                           "🔸 工序监控：实时查看各工序执行状态\n" +
                           "🔸 质量控制：设置质量检查点和标准\n" +
                           "🔸 工时管理：标准工时设定和实际工时统计\n\n" +
                           "📋 通过 /api/customer/workorderprocesses 可以获取工序数据。\n\n" +
                           "您想了解工序的具体哪个方面？";
                }
            }
            
            // 报工相关问题
            else if (message.Contains("报工") || message.Contains("生产") || message.Contains("产量"))
            {
                if (message.Contains("如何") || message.Contains("怎么") || message.Contains("操作"))
                {
                    return "生产报工操作步骤：\n\n" +
                           "1. 进入报工管理模块\n" +
                           "2. 选择对应的工单和工序\n" +
                           "3. 填写报工信息：\n" +
                           "   • 实际生产数量\n" +
                           "   • 合格数量\n" +
                           "   • 不合格数量及原因\n" +
                           "   • 实际工时\n" +
                           "4. 如有异常情况，填写异常报告\n" +
                           "5. 提交报工数据\n\n" +
                           "📝 报工数据会自动更新工单进度和库存信息。";
                }
                else
                {
                    return "报工功能说明：\n\n" +
                           "🔸 生产报工：记录实际生产数量和工时\n" +
                           "🔸 质量报工：记录产品质量检验结果\n" +
                           "🔸 异常报工：记录生产异常和处理措施\n" +
                           "🔸 进度跟踪：实时更新工单执行进度\n" +
                           "🔸 数据统计：生成生产效率和质量报表\n\n" +
                           "📊 通过 /api/customer/workreports 可以获取报工数据。\n\n" +
                           "需要了解具体的报工操作吗？";
                }
            }
            
            // 系统功能相关
            else if (message.Contains("功能") || message.Contains("模块") || message.Contains("系统"))
            {
                return "MES生产管理系统主要功能模块：\n\n" +
                       "📋 工单管理：生产订单的全生命周期管理\n" +
                       "⚙️ 工序管理：生产工艺流程配置和监控\n" +
                       "📊 报工管理：生产数据采集和进度跟踪\n" +
                       "📈 数据分析：生产效率和质量统计分析\n" +
                       "🔧 设备管理：生产设备状态监控\n" +
                       "👥 人员管理：操作人员和权限管理\n" +
                       "📦 库存管理：原料和成品库存跟踪\n\n" +
                       "请告诉我您想详细了解哪个模块？";
            }
            
            // 问题和故障
            else if (message.Contains("问题") || message.Contains("错误") || message.Contains("故障") || message.Contains("异常"))
            {
                return "常见问题解决方案：\n\n" +
                       "🔧 系统登录问题：\n" +
                       "   • 检查用户名密码是否正确\n" +
                       "   • 确认账户是否被锁定\n" +
                       "   • 联系管理员重置密码\n\n" +
                       "📊 数据显示问题：\n" +
                       "   • 刷新页面重新加载数据\n" +
                       "   • 检查网络连接状态\n" +
                       "   • 确认数据权限设置\n\n" +
                       "⚡ 系统响应慢：\n" +
                       "   • 关闭不必要的浏览器标签\n" +
                       "   • 清理浏览器缓存\n" +
                       "   • 联系技术支持检查服务器状态\n\n" +
                       "如果问题仍然存在，请详细描述具体错误信息。";
            }
            
            // 帮助和指导
            else if (message.Contains("帮助") || message.Contains("指导") || message.Contains("教程"))
            {
                return "MES系统使用指导：\n\n" +
                       "📚 新手入门：\n" +
                       "   • 系统登录和界面介绍\n" +
                       "   • 基本操作流程\n" +
                       "   • 权限和角色说明\n\n" +
                       "🎯 核心功能：\n" +
                       "   • 工单管理完整流程\n" +
                       "   • 生产报工标准操作\n" +
                       "   • 数据查询和分析\n\n" +
                       "💡 最佳实践：\n" +
                       "   • 数据录入规范\n" +
                       "   • 异常处理流程\n" +
                       "   • 效率提升技巧\n\n" +
                       "请告诉我您需要哪方面的具体指导？";
            }
            
            // 默认智能回复
            else
            {
                // 基于关键词的智能匹配
                var keywords = new Dictionary<string, string>
                {
                    { "数量", "关于数量管理：您可以在工单中设置计划数量，在报工时记录实际完成数量。系统会自动计算完成率和剩余数量。" },
                    { "时间", "关于时间管理：系统支持标准工时设定、实际工时记录、交期管理等功能。可以实时跟踪生产进度。" },
                    { "质量", "关于质量管理：系统提供质量检验点设置、不合格品处理、质量统计分析等功能，确保产品质量。" },
                    { "设备", "关于设备管理：可以查看设备状态、维护记录、使用效率等信息，合理安排生产资源。" },
                    { "库存", "关于库存管理：系统可以跟踪原料消耗、成品入库、库存预警等，实现精准库存控制。" },
                    { "计划", "关于生产计划：可以制定生产计划、排程优化、资源配置，提高生产效率。" },
                    { "统计", "关于数据统计：系统提供丰富的报表功能，包括生产效率、质量分析、成本统计等。" },
                    { "权限", "关于权限管理：系统支持角色权限配置，确保数据安全和操作规范。" }
                };

                foreach (var keyword in keywords)
                {
                    if (message.Contains(keyword.Key))
                    {
                        return keyword.Value + "\n\n需要了解更详细的操作步骤吗？";
                    }
                }

                // 智能分析用户意图
                if (message.Contains("怎么") || message.Contains("如何") || message.Contains("怎样"))
                {
                    return "我理解您想了解具体的操作方法。\n\n" +
                           "为了给您提供更准确的指导，请告诉我：\n" +
                           "• 您想操作哪个功能模块？\n" +
                           "• 遇到了什么具体问题？\n" +
                           "• 当前处于哪个操作步骤？\n\n" +
                           "这样我可以为您提供更有针对性的帮助。";
                }
                
                if (message.Contains("为什么") || message.Contains("原因"))
                {
                    return "我可以帮您分析问题原因。\n\n" +
                           "常见问题类型：\n" +
                           "• 操作问题：可能是操作步骤不正确\n" +
                           "• 数据问题：可能是权限或数据同步问题\n" +
                           "• 系统问题：可能是网络或服务器问题\n\n" +
                           "请详细描述您遇到的具体情况，我会帮您找出原因。";
                }

                // 默认智能回复
                return "我是您的MES系统智能助手！👋\n\n" +
                       "虽然我没有完全理解您的问题，但我可以帮助您：\n\n" +
                       "🔍 常用功能：\n" +
                       "• 工单管理 - 输入\"工单\"了解详情\n" +
                       "• 工序流程 - 输入\"工序\"了解详情\n" +
                       "• 生产报工 - 输入\"报工\"了解详情\n\n" +
                       "💬 您可以这样问我：\n" +
                       "• \"如何创建工单？\"\n" +
                       "• \"工序流程怎么设置？\"\n" +
                       "• \"报工数据在哪里查看？\"\n\n" +
                       "请重新描述您的问题，我会尽力为您解答！";
            }
        }

        /// <summary>
        /// 保存消息到数据库
        /// </summary>
        private async Task SaveMessageAsync(string sessionId, string messageType, string content, int? responseTimeMs = null)
        {
            var message = new ChatMessage
            {
                MessageId = Guid.NewGuid().ToString(),
                SessionId = sessionId,
                MessageType = messageType,
                Content = content,
                ResponseTimeMs = responseTimeMs,
                CreatedAt = DateTime.Now
            };

            await _db.Insertable(message).ExecuteCommandAsync();

            // 更新会话的最后更新时间
            await _db.Updateable<ChatSession>()
                .SetColumns(s => s.UpdatedAt == DateTime.Now)
                .Where(s => s.SessionId == sessionId)
                .ExecuteCommandAsync();
        }

        /// <summary>
        /// 创建聊天会话（内部方法）
        /// </summary>
        private async Task CreateChatSessionInternalAsync(string sessionId, string? userId)
        {
            var session = new ChatSession
            {
                SessionId = sessionId,
                UserId = userId,
                Title = "新对话",
                CreatedAt = DateTime.Now,
                UpdatedAt = DateTime.Now,
                IsActive = true
            };

            await _db.Insertable(session).ExecuteCommandAsync();
        }

        /// <summary>
        /// 获取聊天历史（内部方法）
        /// </summary>
        private async Task<List<ChatMessage>> GetChatHistoryInternalAsync(string sessionId, int limit = 20)
        {
            return await _db.Queryable<ChatMessage>()
                .Where(m => m.SessionId == sessionId)
                .OrderByDescending(m => m.CreatedAt)
                .Take(limit)
                .OrderBy(m => m.CreatedAt)
                .ToListAsync();
        }

        #endregion
    }
}
